/**
 * 校验服务
 */
export class VerifyService{

    /**
     * 验证URL
     * @param url 待校验的url
     * @return {boolean} 有效true 无效false
     */
    static verifyUrl(url) {
        // 检查是否为空
        if (!url) {
            return false;
        }

        // 检查是否以http或https开头
        if (!/^https?:\/\//i.test(url)) {
            return false;
        }

        // 检查是否包含中文字符
        if (/[\u4e00-\u9fa5]/.test(url)) {
            return false;
        }

        // 基本的URL格式验证
        try {
            new URL(url);
            return true;
        } catch (e) {
            return false;
        }
    }

    /**
     * 验证域名
     * @param domain 待校验的域名
     * @return {boolean} 验证通过true 验证失败false
     */
    static verifyDomain(domain) {
        // 检查是否为空
        if (!domain) {
            return false;
        }

        // 检查是否包含中文字符
        if (/[\u4e00-\u9fa5]/.test(domain)) {
            return false;
        }

        // 域名格式验证
        // 域名只能包含字母、数字、连字符(-)和点(.)
        // 不能以连字符开头或结尾
        // 每个标签不能超过63个字符，总长度不能超过253个字符
        const domainRegex = /^(?!-)[A-Za-z0-9-]{1,63}(?<!-)(\.(?!-)[A-Za-z0-9-]{1,63}(?<!-))*$/;

        if (!domainRegex.test(domain)) {
            return false;
        }

        // 检查总长度
        if (domain.length > 253) {
            return false;
        }

        // 检查是否包含至少一个点（确保不是单纯的主机名）
        if (!domain.includes('.')) {
            return false;
        }
        return true;
    }

    /**
     * 验证SLD 二级域名
     * @param sld 待验证的二级域名
     */
    static verifySld(sld) {
        // 检查是否为空
        if (!sld) {
            return false;
        }

        // 检查长度（二级域名一般不超过63个字符）
        if (sld.length > 63) {
            return false;
        }

        // 检查是否包含中文字符
        if (/[\u4e00-\u9fa5]/.test(sld)) {
            return false;
        }

        // 检查是否包含特殊字符（只允许字母、数字和连字符）
        if (!/^[a-zA-Z0-9-]+$/.test(sld)) {
            return false;
        }

        // 不能以连字符开头或结尾
        if (sld.startsWith('-') || sld.endsWith('-')) {
            return false;
        }

        // 不能是纯数字
        if (/^\d+$/.test(sld)) {
            return false;
        }

        // 检查SQL注入风险关键词
        const sqlKeywords = [
            'select', 'insert', 'update', 'delete', 'drop', 'create', 'alter', 'exec',
            'union', 'script', 'javascript', 'iframe', 'onload', 'alert', 'eval'
        ];

        const sldLower = sld.toLowerCase();
        for (let keyword of sqlKeywords) {
            if (sldLower.includes(keyword)) {
                return false;
            }
        }
        return true;
    }

    /**
     * 验证姓名
     * @param name 待验证的姓名
     * @return {boolean} 验证通过true 验证失败false
     */
    static verifyName(name) {
        // 检查是否为空
        if (!name) {
            return false;
        }

        // 检查长度（姓名一般不超过50个字符）
        if (name.length > 50) {
            return false;
        }

        // 检查是否只包含中文字符
        if (!/^[\u4e00-\u9fa5]+$/.test(name)) {
            return false;
        }

        return true;
    }
}

